# 函数
def add_num1():
    result = 1+2
    print(result)

add_num1()

def add_num1(a,b):
    result=a+b
    print(result)
add_num1(11,20)

def buy():
    return  'yan'
good=buy()
print(good)

def sum_num(a,b):
    return a+b
result = sum_num(1,2)
print(result)

#
def sum_num(a,b):
    return a+b
help(sum_num)

# 所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数。
def testb():
    print('____1')
    print('____2')
    print('____3')

def testa():
    print('____3')
    print('____4')
    print('____5')

testb()

# 1. 打印一条横线
def print_line():
    print('_'*20)
print_line()

# 1. 求三个数之和
def print_line():
    print('_'*30)

def print_lines(num):
    i =0
    while i <num:
        print_line()
        i +=1
print_lines(5)

# 1. 求三个数之和
def sum_num(a,b,c):
    return a+b+c
result = sum_num(4,2,3)
print(result)

# 求三个数平均值
def acerage_num(a,b,c):
    sumresult= sum_num(a,b,c)
    return sumresult / 3
result = acerage_num(1,2,3)
print(result)

# 变量作用域指的是变量生效的范围, 主要分为两类:局部变量和全局变量。
# 局部变量
def testa():
    a=100
    print(a)
# testa()
# print(a)


# 全局变量
a=100
def testa():
    print(a)

def testb():
    # 声明这是全局变量
    global a
    a=200
    print(a)
testa()
testb()
testa()

# 函数返回值
def reture_num():
    return 1,2
res=reture_num()
print(res)

# 位置参数
def user_info(name,age,gender):
    print(f'您的名字是{name},年龄是{age},性别是{gender}')

user_info('tom',18,'女')

#关键字参数
def user_info(name, age, gender):
    print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('yoy',age=10,gender='女')
user_info('小明',gender='女',age=15)

#缺省值参数
def user_info(name, age, gender='男'):
    print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')

user_info('tom',190)
user_info('wq',18,'女')

# 不定长参数
def user_info(*args):
    print(args)
user_info('tom')
user_info('tom',18)
list1=[1,2,3]
user_info(*list1)

# 包裹关键字传递
def user_info(**kwargs):
    print(kwargs)
user_info(name='tom',age=18,id=110)
dict1={'name':'tom','age':'18','id':'111'}
user_info(**dict1)

# 拆包元组
def retu():
    return 100,200
num1,num2=retu()
print(num1)
print(num2)

a,b=1,2
a,b =b,a
print(a)
print(b)

#可变类型
# 列表
# 字典
# 集合
# 不可变类型
# 整型
# 浮点型
# 字符串
# 元组

# 文件操作
# 打开文件open（）
# # 1. 打开文件
# f = open('test.txt', 'w')
# 2.文件写入
# f.write('hello world')
# 3. 关闭文件
# f.close()

# 读取文件
# f = open('test.txt')
# content = f.readlines()
# ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']
# print(content)
# 关闭文件
# f.clo

# f = open('test.txt')
# content = f.readline()
# print(f'第一行：{content}')
# content = f.readline()
# print(f'第二行：{content}')
# 关闭文件
# f.close()

# seek()
# 0: 文件开头
# 1: 当前位置
# 2: 文件结尾

# tell()


# 文件操作
# import os

# 文件重命名
# os.rename(目标文件名,新文件名)

# 删除文件
# os.remove(目标文件名)

# 创建文件夹
# os.mkdir(文件夹名字)

# 删除文件夹
# os.rmdir(文件夹名字)


# 获取当前目录
# os.getcwd()

# 改变默认目录
# os.chdir(目录)
#
#
# 获取目录列表
# os.listdir(目录)
#
# 获取文件所在目录
# os.path.dirname(文件绝对路径)


# 需求：批量修改文件名，既可添加指定字符串，又能删除指定字符串。
# 步骤
# 1. 设置添加删除字符串的标识
# 2. 获取指定目录的所有文件
# 3. 将原有文件名添加/删除指定字符串,构造新名字
# 4. os.rename()重命名

import os
# 设置重命名标识：如果为1则添加指定字符，flag取值为2则删除指定字符
flag = 1
# 获取指定目录
dir_name = './'
# 获取指定目录的文件列表
file_list = os.listdir(dir_name)
# print(file_list)
# 遍历文件列表内的文件
for name in file_list:
# 添加指定字符
    if flag == 1:
        new_name = 'Python-' + name
# 删除指定字符
    elif flag == 2:
        num = len('Python-')
        new_name = name[num:]
# 打印新文件名，测试程序正确性
print(new_name)
# 重命名
os.rename(dir_name + name, dir_name + new_name)

# 递归
def sum_numbers(num):
# 1.如果是1，直接返回1 -- 出口
    if num == 1:
        return 1
# 2.如果不是1，重复执行累加并返回结果
        return num + sum_numbers(num - 1)
sum_result = sum_numbers(3)
# 输出结果为6
print(sum_result)


# lambda 参数列表: 表达式
fn2 = lambda: 100
print(fn2)
print(fn2())

fn1 = lambda a, b: a + b
print(fn1(1, 2))

# 无参数
fn1 = lambda: 100
print(fn1())

#一个参数
fn1 = lambda a: a
print(fn1('hello world'))

#  默认参数
fn1 = lambda a, b, c=100: a + b + c
print(fn1(10, 20))

#  可变参数: *args
fn1 = lambda *args: args
print(fn1(10, 20, 30))

# 可变参数: **kwargs
fn1 = lambda **kwargs: kwargs
print(fn1(name='python', age=20))

# 带判断的lambda
fn1 = lambda a, b: a if a > b else b
print(fn1(1000, 500))

# 2 列表数据按字典key的值排序
students = [
{'name': 'TOM', 'age': 20},
{'name': 'ROSE', 'age': 19},
{'name': 'Jack', 'age': 22}
]
# 按name值升序排列
students.sort(key=lambda x: x['name'])
print(students)
# 按name值降序排列
students.sort(key=lambda x: x['name'], reverse=True)
print(students)
# 按age值升序排列
students.sort(key=lambda x: x['age'])
print(students)


# 高阶函数  abs()函数可以完成对数字求绝对值计算。
def add_num(a, b):
    return abs(a) + abs(b)
result = add_num(-1, 2)
print(result)

def sum_num(a, b, f):
    return f(a) + f(b)
result = sum_num(-1, 2, abs)
print(result)

# map()

list1 = [1, 2, 3, 4, 5]
def func(x):
    return x ** 2
result = map(func, list1)
print(result)
print(list(result))

#  reduce()
import functools
list1 = [1, 2, 3, 4, 5]
def func(a, b):
    return a + b
result = functools.reduce(func, list1)
print(result)

# filter()
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def func(x):
    return x % 2 == 0
result = filter(func, list1)
print(result) #
print(list(result))

# 作业
# 1.使用列表推导式生成能被5整除的数（100以内）
# 2.有两个列表，一个是学生姓名，一个是学生的年龄，生成一个字典，key为姓名，value为年龄
# 3.开发一个注册系统，
# 页面：
# [{name:xxx,age:xxx},{name:xxx,age:xxx},{name:xxx,age:xxx}]
# ----------------
# *   1-新增用户
# *   1-新增用户
# *   2-查询用户
# *   3-删除用户
# ----------------
# 功能1：新增学生信息（姓名和年龄）通过键盘，如果学生已经存在提示用户已存在
# 功能2：查询学生信息
# 功能3：删除学生信息